`
https://leetcode.cn/problems/longest-substring-with-at-least-k-repeating-characters/
`

/**
 * @param {string} s
 * @param {number} k
 * @return {number}
 */
var longestSubstring = function (s, k) {
  let len = 0
  for (let i = 1; i <= 26; i++) {
    // 限制窗口中只能有 i 种不同字符
    len = Math.max(len, longestKLetterSubstr(s, k, i))
  }
  return len
};

function longestKLetterSubstr(s, k, count) {
  // 返回结果
  let res = 0
  // 左右指针
  let left = 0, right = 0
  // 窗口里各个字符的数量
  const window = new Array(26).fill(0)
  // a 的 ascii
  const asciiOfa = 'a'.charCodeAt(0)
  // 窗口里有多少种字符
  let windowCharCount = 0
  // 窗口里有多少种达标字符（>= k）
  let windowCharIsOK = 0

  while (right < s.length) {
    // 新加入的字符
    const c = s[right]
    // 如果是新加入的字符
    if (window[c.charCodeAt(0) - asciiOfa] === 0) {
      // 记录新增的字符种类
      windowCharCount++
    }
    // 增加该字符的出现次数
    window[c.charCodeAt(0) - asciiOfa]++
    // 如果新加入的字符的次数符合条件
    if (window[c.charCodeAt(0) - asciiOfa] === k) {
      // 记录符合条件的新字符
      windowCharIsOK++
    }
    right++

    // 当窗口中字符种类大于 count 时，缩小窗口
    while (windowCharCount > count) {
      // 移出字符，缩小窗口
      let d = s.charAt(left);
      if (window[d.charCodeAt(0) - 'a'.charCodeAt(0)] === k) {
        // 窗口中减少了一种达标的字符
        windowCharIsOK--;
      }
      window[d.charCodeAt(0) - 'a'.charCodeAt(0)]--;
      if (window[d.charCodeAt(0) - 'a'.charCodeAt(0)] === 0) {
        // 窗口中减少了一种字符
        windowCharCount--;
      }
      left++;
    }

    // 当窗口中字符种类为 count 且每个字符出现次数都满足 k 时，更新答案
    if (windowCharIsOK === count) {
      res = Math.max(res, right - left);
    }
  }

  return res
}